//
//  CLPointerFunction.c
//  Charles
//
//  Created by Leo on 2017/4/25.
//  Copyright © 2017年 charles. All rights reserved.
//

#include "CLPointerFunction.h"
#include <string.h>

#pragma mark - 指针函数

//声明一个指针函数
int *minValue(int *a,int *b) {
    return (a > b ? a : b);
}

void getMinValue () {
    int a = 10,b = 4;
    int *value = minValue(&a, &b);
    printf("min value is %d",*value);
}

#pragma mark - 函数指针
/*
 函数指针其实就是一种特殊的指针——指向一个函数的指针
 */

//声明一个函数
int maxValue (int a, int b) {
    return a > b ? a : b;
}

int minNumber(int a, int b) {
    return (a > b ? a : b);
}


void getMaxValue () {
    //声明指针函数
    int (*getMax)(int a, int b) = NULL;
    getMax = maxValue;
    //调用指针函数
    int value =  getMax(2,4);
    printf("max value is %d",value);
}

//函数指针回调函数

_Bool compareGreater (int number, int compareNumber) {
    return number > compareNumber;
}

_Bool compareLess (int number, int compareNumber) {
    return number < compareNumber;
}

//声明一个带函数指针参数的函数
void compareNumberFunction(int *numberArray, int count, int compareNumber,_Bool (*compare)(int ,int)) {
    for (int i = 0; i < count; i++) {
        if (compare(numberArray[i],compareNumber)) {
            printf("%d\n",numberArray[i]);
        }
    }
}

void compareNumbers() {
    int numberArray[] = {20,12,33,56,67,40};
    int compareNumber = 35;
    int count = sizeof(numberArray)/sizeof(numberArray[0]);
    //大于被比较的数字
    //compareNumberFunction(numberArray, count, compareNumber, compareGreater);
    //小于被比较的数字
    compareNumberFunction(numberArray, count, compareNumber, compareLess);
}

//函数指针作为一个返回值
typedef int (*FUNC)(int, int);

FUNC findFuction(char *name) {
    if (0 == strcmp(name, "max")) {
        return maxValue;
    } else if (0 == strcmp(name, "min")) {
        return minNumber;
    }
    printf("Function name error");
    return NULL;
}

void returnPointerFunction() {
    
    int (*find(char*))(int ,int);//返回 指向一个返回整型的函数的指针(这种类型：int (*)(int, int))（当然这个指针是函数指针）
    /*
     分析一下上面的声明：
     1.find 是一个标识符
     2.find()是一个函数
     3.find(char *)函数接收一个类型为char*的参数
     4.*find(char *)函数返回一个指针
     5.(*find(char *))()这个指针指向一个函数
     6.(*find(char *))(int ,int)指针指向的函数接收两个整型参数
     7.int (*find(char *))(int ,int)指针指向的函数返回一个整型
     */
    
    int (*p)(int, int) = findFuction("max");
    printf("return p is %d\n",p(3,5));
    
    int (*q)(int, int) = findFuction("min");
    printf("return q is %d\n",q(3,5));
}

#pragma mark - 结构体

struct TestA {
    int a;
    int b;
    int c;
};

struct ValueB {
    int b;
};

struct TestB {
    struct ValueB valueB;
    int a;
    int c;
};

void testStruct() {
    struct TestB temp = {{2},1,3};
    struct TestB *b = &temp;
    printf("%d\n",b->valueB.b);
    struct ValueB *valueB = (struct ValueB *)b;
    printf("valueB.b = %d\n",valueB->b);
}


